Loading...
 

Algorytm solwera frontalnego

Algorytm solwera frontalnego był pierwszym algorytmem modyfikującym eliminację Gaussa wykorzystującym dodatkową wiedzę o metodzie elementów skończonych. Celem modfikacji algorytmu było omijanie zer w macierzy wynikających z interakcji pomiędzy funkcjami bazowymi rozpiętymi na siatce obliczeniowej, znajdującymi się daleko od siebie.
Algorytm ten został zaproponowany przez Bruce'a Irons'a w 1970 roku. Bruce Irons zdobył szeroką sławę po wynalezieniu tego algorytmu [1]. Jego wyniki naukowe tym bardziej zasługują na uznanie, ponieważ zmagał się z nieuleczalną chorobą jaką było stwardnienie rozsiane.
Idea algorytmu polega na generowaniu lokalnych macierzy wynikających z interakcji funkcji bazowych na poszczególnych elementach skończonych. Zamiast generować całą macierz, cały układ równań, układamy elementy skończone w wybranej kolejności. Generujemy fragment macierzy wynikający z interakcji funkcji bazowych na pierwszym elemencie.
Wiersze i kolumny macierzy elementowych odpowiadają poszczególnym funkcjom bazowym rozpostartym na danym elemencie. Wyrazy macierzy oznaczają interakcję funkcji bazowych z wiersza i kolumny (całkę z iloczynu funkcji bazowych policzoną na danym elemencie).
Niektóre wiersze macierzy mogą zostać w pełni wygenerowane, niektóre jedynie częściowo, ponieważ brakować będzie pewnych kolumn wynikających z faktu iż funkcje bazowe występujące na danym elemencie rozpościerają się na sąsiednich elementach, i oddziaływują (mając wspólne nośniki dziedziny) z funkcjami bazowymi z kolejnych elementów (z kolejnych kolumn macierzy).


Rozpatrzmy algorytm solwera frontalnego na następującym przykładzie. Załóżmy iż stosujemy izogeometryczną metodę elementów skończonych dla trzech elementów jednowymiarowych, dla kwadratowych funkcji B-spline. Mamy więc pięć funkcji B-spline rozpiętych na trzech elementach.
Macierze elementowe dla izogeometrycznej metody elementów skończonych, tak jak opisano to rozdziale pierwszym, zawierają interakcje pomiędzy segmentami B-spline'ów rozpostartych na pojedynczym przedziale - elemencie skończonym
\( \begin{bmatrix} \int_0^1{B_1(x)B_1(x)dx} & \int_0^1{B_1(x)B_2(x)dx } & \int_0^1{B_1(x)B_3(x)dx} \\ \int_0^1{B_2(x)B_1(x)dx} & \int_0^1{B_2(x)B_2(x)dx } & \int_0^1{B_2(x)B_3(x)dx } \\ \int_0^1{B_3(x)B_1(x)dx} & \int_0^1{B_3(x)B_2(x)dx} & \int_0^1{B_3(x)B_3(x)dx } \\ \end{bmatrix} = \begin{bmatrix} \frac{1}{20} & \frac{13}{120} & \frac{1}{120} \\ \frac{13}{120} & \frac{9}{20} & \frac{13}{120} \\ \frac{1}{120} & \frac{13}{120} & \frac{1}{20} \\ \end{bmatrix} \)
Dla siatki zbudowanej z czterech elementów, macierz globalna wygląda następująco:
\( \begin{bmatrix} \frac{1}{20} & \frac{13}{120} & \frac{1}{120} & \cdots \\ \frac{13}{120} & \frac{9}{20} +\color{red}{\frac{1}{20}}& \frac{13}{120} + \color{red}{\frac{13}{120}} & \color{red}{\frac{1}{120}} & \cdots \\ \frac{1}{120} & \frac{13}{120} +\color{red}{\frac{13}{120}} & \frac{1}{20} +\color{red}{\frac{9}{20}} +\color{blue}{\frac{1}{20}} & \color{red}{\frac{13}{120}} +\color{blue}{\frac{13}{120}} & \color{blue}{\frac{1}{120}} & \cdots \\ \cdots & \color{red}{\frac{1}{120}} & \color{red}{\frac{13}{120}} +\color{blue}{\frac{13}{120}} & \color{red}{\frac{1}{20}}+\color{blue}{\frac{9}{20}} +\color{green}{\frac{1}{20}} & \color{blue}{\frac{13}{120}} +\color{green}{\frac{13}{120}} & \color{green}{\frac{1}{120}} \\ & \cdots & \color{blue}{\frac{1}{120} } & \color{blue}{\frac{13}{120}} +\color{green}{\frac{13}{120}} & \color{blue}{\frac{1}{20} } + \color{green}{\frac{9}{20}} & \color{green}{\frac{13}{120} } \\ & & \cdots & \color{green}{\frac{1}{120}} & \color{green}{\frac{13}{120}} & \color{green}{\frac{1}{20} }\\ \end{bmatrix} \)
Algorytm solwera frontalnego generuje macierze elementowe jedną po drugiej i dodaje je do globalnej macierzy, eliminując w pełni zagregowane wiersze.
W pierwszym kroku nasza macierz elementowa wygląda więc w sposób następujący:
\( \begin{bmatrix} & B1(x) & B2(x) & B3(x) \\ B1(x) & \frac{1}{20} & \frac{13}{120} & \frac{1}{120} \\B2(x) & \frac{13}{120} & \frac{9}{20} & \frac{13}{120} \\ B3(x) & \frac{1}{120} & \frac{13}{120} & \frac{1}{20} \\ \end{bmatrix} \)
Dla lepszej ilustracji działania algorytmu pozostawimy liczby w postaci ułamkowej, pamiętając oczywiście że w komputerze przechowywane są one w postaci zmiennoprzecinkowej.
Na pierwszym elemencie jesteśmy w stanie wyeliminować pierwszy wiersz, który zawiera segment pierwszego B-spline'a który został przycięty do brzegu naszej siatki. Dokonujemy więc eliminacji pierwszego wiersza.
Skalujemy pierwszy wiersz tak by uzyskać jedynkę na przekątnej
\( \begin{bmatrix}\frac{1}{20}{\color{red}*20} & \frac{13}{120}{\color{red}*20} & \frac{1}{120}{\color{red}*20} \\\frac{13}{120} & \frac{9}{20} & \frac{13}{120} \\\frac{1}{120} & \frac{13}{120} & \frac{1}{20} \\ \end{bmatrix} \\ \begin{bmatrix} u_{1} \\ u_{2} \\ u_{3} \\ \end{bmatrix} = \begin{bmatrix}1{\color{red}*20} \\ 1 \\ 1 \\ \end{bmatrix} \)
\( \begin{bmatrix}{\color{red}1} & {\color{red}\frac{13}{6}} & {\color{red}\frac{1}{6}} \\\frac{13}{120} & \frac{9}{20} & \frac{13}{120} \\\frac{1}{120} & \frac{13}{120} & \frac{1}{20} \\ \end{bmatrix} \nonumber\\ \begin{bmatrix} u_{1} \\ u_{2} \\ u_{3} \\ \end{bmatrix} = \begin{bmatrix}{\color{red}20} \\ 1 \\ 1 \\ \end{bmatrix} \)
Ponieważ pierwszy wiersz jest w pełni wygenerowany, możemy go wyeliminować (uruchomić eliminację Gassua która odejmuje ten wiersz od pozostałych wierszy dostępnych w macierzy). Jest tak dlatego, iż nawet jeśli następne wiersze nie są w pełni wygenerowane, to możemy od nich odejmować pierwszy wiersz. Gdy będziemy generować resztę tych niewygenerowanych wierszy, to dodamy do nich brakujące wyrazy. Ponieważ dodawanie i odejmowanie wierszy jest przemienne, możemy najpierw odjąć w pełni wygenerowany wiersz, a potem dodać brakującą resztę do tych wierszy.
\( 2^{nd}=2^{nd}-1^{st}*A(2,1)=2^{nd}-1^{st}*13/120 \)
\( \begin{bmatrix}{\color{red}1} & {\color{red}\frac{13}{6}} & {\color{red}\frac{1}{6}} \\\frac{13}{120}{\color{red}-1\frac{13}{120}} & \frac{9}{20}{\color{red}-\frac{13}{6}\frac{13}{120}} & \frac{13}{120}{\color{red}-\frac{1}{6}\frac{13}{120}} \\\frac{1}{120} & \frac{13}{120} & \frac{1}{20} \\ \end{bmatrix} \\ \begin{bmatrix} u_{1} \\ u_{2} \\ u_{3} \\ \end{bmatrix} = \begin{bmatrix}{\color{red}20} \\ 1{\color{red}-20\frac{13}{120}} \\ 1 \end{bmatrix} \)
\( \begin{bmatrix}1 & \frac{13}{6} & \frac{1}{6} \\{\color{red}0} & {\color{red}\frac{31}{144}} & {\color{red}\frac{13}{144}} \\\frac{1}{120} & \frac{13}{120} & \frac{1}{20} \\ \end{bmatrix} \\ \begin{bmatrix} u_{1} \\ u_{2} \\ u_{3} \\ \end{bmatrix} = \begin{bmatrix} 20 \\ {\color{red}-\frac{7}{6}} \\ 1 \end{bmatrix} \)
\( 3^{rd}=3^{rd}-1^{st}*A(3,1)=3^{rd}-1^{st}1/120 \)
\( \begin{bmatrix}1 & \frac{13}{6} & \frac{1}{6} \\ 0 & \frac{31}{144} & \frac{13}{144} \\\frac{1}{120}{\color{red}-1\frac{1}{120}} & \frac{13}{120}{\color{red}-\frac{31}{144}\frac{1}{120}} & \frac{1}{20}{\color{red}-\frac{13}{144}\frac{1}{120}} \\ \end{bmatrix} \\ \begin{bmatrix} u_{1} \\ u_{2} \\ u_{3} \\ \end{bmatrix} = \begin{bmatrix}20 \\ -\frac{7}{6} \\ 1{\color{red}-20\frac{1}{120}} \end{bmatrix} \)
\( \begin{bmatrix}1 & \frac{13}{6} & \frac{1}{6} \\ 0 & \frac{31}{144} & \frac{13}{144} \\{\color{red}0} & {\color{red}\frac{1841}{17280}} & {\color{red}\frac{864}{17280}} \\ \end{bmatrix} \\ \begin{bmatrix} u_{1} \\ u_{2} \\ u_{3} \\ \end{bmatrix} = \begin{bmatrix} 20 \\ -\frac{7}{6} \\ {\color{red}\frac{5}{6}} \end{bmatrix} \)
W tym momencie nie jesteśmy w stanie wyeliminować drugiego wiersza, ponieważ wszystkie B-spline'y które w nim występują, są również rozpięte na drugim elemencie.
Nie możemy więc pomnożyć drugiego wiersza przez wartość z kolumny ponieważ opuścilibyśmy pozostałą część wiersza (nie przemnożymy części wiersza która nie została jeszcze wygenerowana). Musimy więc wygenerować macierz drugiego elementu
\( \begin{bmatrix}{\color{red}\frac{1}{20}} & {\color{red}\frac{13}{120}} & {\color{red}\frac{1}{120}}\\{\color{red}\frac{13}{120}} & {\color{red}\frac{9}{20}} & {\color{red}\frac{13}{120}} \\ {\color{red}\frac{1}{120}} & {\color{red}\frac{13}{120}} & {\color{red}\frac{1}{20}} \\ \end{bmatrix} \\ \begin{bmatrix} u_{2} \\ u_{3} \\ u_{4} \\ \end{bmatrix} = \begin{bmatrix} {\color{red}1} \\ {\color{red}1} \\ {\color{red}1} \end{bmatrix} \)
i dodać ją do części sfaktoryzowanej już macierzy pierwszego elementu.
\( \begin{bmatrix}1 & \frac{13}{6} & \frac{1}{6} & 0 \\ 0 & \frac{31}{144}{\color{red}+\frac{1}{20}} & \frac{13}{144} {\color{red}+\frac{13}{120}}& {\color{red}\frac{1}{120}} \\ 0 & \frac{1841}{17280}{\color{red}+\frac{13}{120}} & \frac{864}{17280}{\color{red}+\frac{9}{20}} & {\color{red}\frac{13}{120}}\\ 0 & {\color{red}\frac{1}{120}} & {\color{red}\frac{13}{120}} & {\color{red}\frac{1}{20}} \\ \end{bmatrix} \\ \begin{bmatrix} u_{1} \\ u_{2} \\ u_{3} \\ u_{4} \\ \end{bmatrix} = \begin{bmatrix}0 \\ -\frac{7}{6}{\color{red}+1} \\ \frac{5}{6}{\color{red}+1} \\ {\color{red}1} \end{bmatrix} \)
W macierzy tej możemy już zostawić pierwszy wiersz i pierwszą kolumnę w spokoju, ponieważ zostały one już zfaktoryzowane (pierwszy wiersz został odjęty od pozostałych wierszy, a w pierwszej kolumnie pod przekątną są same zera)
\( \begin{bmatrix}\frac{119}{720} & -\frac{13}{2160} & \frac{1}{120} \\\frac{3713}{17280} & \frac{143}{720} & \frac{13}{120} \\ \frac{1}{120} & \frac{13}{120} & \frac{1}{20} \\ \end{bmatrix} \\ \begin{bmatrix} u_{2} \\ u_{3} \\ u_{4} \\ \end{bmatrix} = \begin{bmatrix} -\frac{1}{6} \\ \frac{11}{6} \\ 1 \end{bmatrix} \)
W tym momencie, ponownie, pierwszy wiersz jest w pełni wygenerowany, więc możemy go wyeliminować, natomiast kolejne wiersze czekają na dogenerowanie pozostałej części, która związana jest z faktem iż funkcje bazowe B-spline rozpościerają się na kolejnych elementach i przecinają się (mają wspólne nośniki dziedzin funkcji) z innymi kolejnymi funkcjami B-spline, które występują na kolejnych elementach.
Eliminujemy więc pierwszy wiersz w naszej macierzy frontalnej
\( 1^{st}=1^{st}\frac{720}{119} \)
\( \begin{bmatrix}\frac{119}{720}{\color{red}\frac{720}{119}} & -\frac{13}{2160}{\color{red}\frac{720}{119}} & \frac{1}{120}{\color{red}\frac{720}{119}} \\\frac{3713}{17280} & \frac{143}{720} & \frac{13}{120} \\ \frac{1}{120} & \frac{13}{120} & \frac{1}{20} \\ \end{bmatrix} \\ \begin{bmatrix} u_{2} \\ u_{3} \\ u_{4} \\ \end{bmatrix} = \begin{bmatrix} -\frac{1}{6}{\color{red}\frac{720}{119}} \\ \frac{11}{6} \\ 1 \end{bmatrix} \)
\( \begin{bmatrix} {\color{red}1} & {\color{red}-\frac{13}{357}} & {\color{red}\frac{6}{119}} \\ \frac{3713}{17280} & \frac{143}{720} & \frac{13}{120} \\ \frac{1}{120} & \frac{13}{120} & \frac{1}{20} \\ \end{bmatrix} \\ \begin{bmatrix} u_{2} \\ u_{3} \\ u_{4} \\ \end{bmatrix} = \begin{bmatrix}{\color{red}-\frac{120}{119}} \\ \frac{11}{6} \\ 1 \end{bmatrix} \)
Eliminujemy teraz pierwszy wiersz odejmując go od nie w pełni zsumowanych wierszy drugiego i trzeciego. Pierwsza kolumna jest w pełni zsumowana, więc możemy w niej wygenerować zera.
\( 2^{nd}=2^{nd}-1^{st}\frac{3713}{17280} \)
\( \begin{bmatrix} 1 & -\frac{13}{357} & \frac{6}{119} \\ \frac{3713}{17280}{\color{red}-1\frac{17280}{3713}} & \frac{143}{720}{\color{red}-\frac{13}{357}\frac{17280}{3713}} & \frac{13}{120}{\color{red}-\frac{6}{119}\frac{17280}{3713}} \\ \frac{1}{120} & \frac{13}{120} & \frac{1}{20} \\ \end{bmatrix} \\ \begin{bmatrix} u_{2} \\ u_{3} \\ u_{4} \\ \end{bmatrix} = \begin{bmatrix} -\frac{120}{119} \\ \frac{11}{6}{\color{red}+\frac{120}{119}\frac{3713}{17280}} \\ 1 \end{bmatrix} \)
\( \begin{bmatrix} 1 & -\frac{13}{357} & \frac{6}{119} \\{\color{red}0} & {\color{red}\frac{9270521}{318129840}} & {\color{red}-\frac{6697589}{53021640}} \\ \frac{1}{120} & \frac{13}{120} & \frac{1}{20} \\ \end{bmatrix} \\ \begin{bmatrix} u_{2} \\ u_{3} \\ u_{4} \\ \end{bmatrix} = \begin{bmatrix} -\frac{120}{119} \\ {\color{red}\frac{35129}{17136}} \\ 1 \end{bmatrix} \)
\( 3^{rd}=2^{rd}-1^{st}\frac{1}{120} \)
\( \begin{bmatrix} 1 & -\frac{13}{357} & \frac{6}{119} \\0 & \frac{9270521}{318129840} & -\frac{6697589}{53021640} \\ \frac{1}{120}{\color{red}-1\frac{1}{120}} & \frac{13}{120}{\color{red}+\frac{13}{357}\frac{1}{120}} & \frac{1}{20}{\color{red}-\frac{6}{119}\frac{1}{120}} \\ \end{bmatrix} \\ \begin{bmatrix} u_{2} \\ u_{3} \\ u_{4} \\ \end{bmatrix} = \begin{bmatrix} -\frac{120}{119} \\ \frac{35129}{17136} \\ 1{\color{red}+\frac{120}{119}\frac{1}{120}} \end{bmatrix} \)
\( \begin{bmatrix} 1 & -\frac{13}{357} & \frac{6}{119} \\0 & \frac{9270521}{318129840} & -\frac{6697589}{53021640} \\ {\color{red}0} & {\color{red}\frac{2327}{21420}} & {\color{red}\frac{59}{1190}} \\ \end{bmatrix} \\ \begin{bmatrix} u_{2} \\ u_{3} \\ u_{4} \\ \end{bmatrix} = \begin{bmatrix} -\frac{120}{119} \\ \frac{27703}{17136} \\ {\color{red}\frac{120}{119}} \end{bmatrix} \)
Wyeliminowaliśmy więc pierwszy wiersz, i pozostałych wierszy nie możemy już wyeliminować ponieważ nie są one w pełni zsumowane (funkcje B-spline związane z tymi wierszami mają pozostałe cześci na innych elementach) nie możemy więc pomnożyć ich przez wartość z kolumny ponieważ opuścili byśmy pozostałą część wierszy (nie przemnożymy części wierszy która nie została jeszcze wygenerowana).
W naszym przykładzie generujemy więc macierz elementową (wraz z prawą stroną) związaną z ostatnim trzecim elementem
\( \begin{bmatrix} {\color{blue}\frac{1}{20}} & {\color{blue}\frac{13}{120}} & {\color{blue}\frac{1}{120}}\\ {\color{blue}\frac{13}{120}} & {\color{blue}\frac{9}{20}} & {\color{blue}\frac{13}{120}} \\{\color{blue}\frac{1}{120}} & {\color{blue}\frac{13}{120}} & {\color{blue}\frac{1}{20}} \\ \end{bmatrix} \\ \begin{bmatrix} u_{3} \\ u_{4} \\ u_{5} \\ \end{bmatrix} = \begin{bmatrix} {\color{blue}1} \\ {\color{blue}1} \\ {\color{blue}1} \end{bmatrix} \)
i dodajemy go do naszej macierzy frontalnej
\( \begin{bmatrix} 1 & -\frac{13}{357} & \frac{6}{119} & 0 \\ 0 & \frac{9270521}{318129840}{\color{blue}+\frac{1}{20}} & -\frac{6697589}{53021640} {\color{blue}+\frac{13}{120}} & {\color{blue}\frac{1}{120}}\\ 0 & \frac{2327}{21420}{\color{blue}+\frac{13}{120}} & \frac{59}{1190}{\color{blue}+\frac{9}{20}} & {\color{blue}\frac{13}{120}} \\ 0 & {\color{blue}\frac{1}{120}} & {\color{blue}\frac{13}{120}} & {\color{blue}\frac{1}{20}} \\ \end{bmatrix} \\ \begin{bmatrix} u_{2} \\ u_{3} \\ u_{4} \\ u_{5} \\ \end{bmatrix} = \begin{bmatrix}-\frac{120}{119} \\ \frac{27703}{17136}{\color{blue}+1} \\ \frac{120}{119}{\color{blue}+1} \\ {\color{blue}1} \end{bmatrix} \)
\( \begin{bmatrix} 1 & -\frac{13}{357} & \frac{6}{119} & 0 \\ 0 & \frac{9270521}{318129840}{\color{blue}+\frac{1}{20}} & -\frac{6697589}{53021640} {\color{blue}+\frac{13}{120}} & {\color{blue}\frac{1}{120}}\\ 0 & \frac{2327}{21420}{\color{blue}+\frac{13}{120}} & \frac{59}{1190}{\color{blue}+\frac{9}{20}} & {\color{blue}\frac{13}{120}} \\ 0 & {\color{blue}\frac{1}{120}} & {\color{blue}\frac{13}{120}} & {\color{blue}\frac{1}{20}} \\ \end{bmatrix} \\ \begin{bmatrix} u_{2} \\ u_{3} \\ u_{4} \\ u_{5} \\ \end{bmatrix} = \begin{bmatrix} -\frac{120}{119} \\ \frac{27703}{17136}{\color{blue}+1} \\ \frac{120}{119}{\color{blue}+1} \\ {\color{blue}1} \end{bmatrix} \)
W macierzy tej możemy już zostawić pierwszy wiersz i pierwszą kolumnę w spokoju, ponieważ zostały one już zfaktoryzowane (pierwszy wiersz został odjęty od pozostałych wierszy, a w pierwszej kolumnie pod przekątną są same zera)
\( \begin{bmatrix} \frac{25177013}{318129840} & -\frac{953578}{53021640} & \frac{1}{120} \\ \frac{1859}{8568} & \frac{1189}{23800} & \frac{13}{120} \\ \frac{1}{120} & \frac{13}{120} & \frac{1}{20} \\ \end{bmatrix} \\ \begin{bmatrix} u_{3} \\ u_{4} \\ u_{5}\\ \end{bmatrix} = \begin{bmatrix} \frac{44839}{17136}\\ \frac{239}{119} \\ 1 \end{bmatrix} \)
Jest to ostatnia macierz dla algorytmu, co więcej jest ona gęsta, możemy więc uruchomić algorytm eliminacji Gaussa z pivotingiem żeby ją rozwiązać, dokonać podstawiania wstecz, żeby rozwiązać pozostałe równania.

Zróbmy teraz następujące obserwacje.
Algorytm solwera frontalnego w przedstawionej powyżej formie pozwala jedynie na pivoting w ramach wierszy które zostały w pełni zsumowane. Jeśli macierz nie jest symetryczna i dodatnio określona stanowi to problem, i uzyskane rozwiązanie może nie być poprawne.
Algorytm solwera frontalnego można uogólnić na dowolne siatki wielowymiarowe, jednakże główną jego wadą jest fakt iż rozmiar macierzy frontalnej (do której dokładamy poszczególne elementy) może rosnąć i koszt tego solwera jest duży. Rozmiar macierzy frontalnej związany jest z rozmiarem interfejsu pomiędzy dodawanymi i eliminowanymi elementami, a całą resztą siatki obliczeniowej. Interfejs ten nazywa się frontem solwera. W ogólnym przypadku rozmiar frontu zależy od rozmiaru i ksztaltu siatki obliczeniowej. Podczas przeglądania elementów siatki dwuwymiarowej wiersz po wierszu, wiersze których funkcje rozpościerają się również na kolejnych wierszach będą musiały poczekać z eliminacją do momentu w którym włączymy do macierzy frontalnej kolejny wiersz. Dlatego też rozmiar macierzy frontalnej będzie równy liczbie funkcji bazowych na przekroju siatki, co w dwóch wymiarach wynosi \( N^{0.5} \) gdzie \( N \) to liczba funkcji bazowych na siatce.


Ostatnio zmieniona Środa 06 z Lipiec, 2022 09:02:46 UTC Autor: Maciej Paszynski
Zaloguj się/Zarejestruj w OPEN AGH e-podręczniki
Czy masz już hasło?

Hasło powinno mieć przynajmniej 8 znaków, litery i cyfry oraz co najmniej jeden znak specjalny.

Przypominanie hasła

Wprowadź swój adres e-mail, abyśmy mogli przesłać Ci informację o nowym haśle.
Dziękujemy za rejestrację!
Na wskazany w rejestracji adres został wysłany e-mail z linkiem aktywacyjnym.
Wprowadzone hasło/login są błędne.